/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.jm.mala.view;

import br.jm.mala.entity.Categoria;
import br.jm.mala.entity.CategoriaGrupo;
import br.jm.mala.lazyModel.GenericDataModel;
import br.jm.mala.lazyModel.GenericLazyDataModel;
import br.jm.mala.service.CategoriaGrupoService;
import br.jm.mala.service.CategoriaService;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import org.apache.commons.beanutils.BeanComparator;
import org.apache.commons.collections.comparators.ComparatorChain;
import org.primefaces.context.RequestContext;
import org.primefaces.model.LazyDataModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

/**
 *
 * @author joao
 */
@Component("categoriaView")
@Scope("view")
public class CategoriaView implements Serializable {

    private static final long serialVersionUID = 233067529147824573L;

    private final CategoriaService categoriaService;
    private final CategoriaGrupoService categoriaGrupoService;
    private LazyDataModel<Categoria> categoriaLazy;
    private Categoria selectedCategoria;
    private FacesMessage msg;
    private final List<CategoriaGrupo> categoriaGrupoData;
    private GenericDataModel listCategoriaGrupo;
    private CategoriaGrupo[] selectedCategoriaGrupos;

    @Autowired
    public CategoriaView(CategoriaService categoriaService, CategoriaGrupoService categoriaGrupoService) {
        this.categoriaService = categoriaService;
        this.categoriaGrupoService = categoriaGrupoService;

        this.categoriaLazy = new GenericLazyDataModel(categoriaService, null, null, "Categoria");
        this.selectedCategoria = new Categoria();

        this.categoriaGrupoData = categoriaGrupoService.loadAll();
        List sortFields = new ArrayList();
        sortFields.add(new BeanComparator("dscGrupo"));
        ComparatorChain multiSort = new ComparatorChain(sortFields);

        java.util.Collections.sort(categoriaGrupoData, multiSort);

        this.listCategoriaGrupo = new GenericDataModel(categoriaGrupoData);
        MenuView.salvar = true;
    }

    public LazyDataModel<Categoria> getCategoriaLazy() {
        return categoriaLazy;
    }

    public void setCategoriaLazy(LazyDataModel<Categoria> categoriaLazy) {
        this.categoriaLazy = categoriaLazy;
    }

    public Categoria getSelectedCategoria() {
        return selectedCategoria;
    }

    public void setSelectedCategoria(Categoria selectedCategoria) {
        this.selectedCategoriaGrupos = new CategoriaGrupo[listCategoriaGrupo.getRowCount()];
        for (int i = 0; i < selectedCategoria.getCategoriaGrupoList().size(); i++) {
            this.selectedCategoriaGrupos[i] = selectedCategoria.getCategoriaGrupoList().get(i);
        }

        this.selectedCategoria = selectedCategoria;
    }

    public void preparaInserir(ActionEvent event) {
        MenuView.salvar = true;
        this.selectedCategoriaGrupos = new CategoriaGrupo[0];
        this.selectedCategoria = new Categoria();
        this.selectedCategoria.setCategoriaGrupoList(new ArrayList<>());
    }

    public void inserir(ActionEvent actionEvent) {
        msg = null;

        try {
            if (this.selectedCategoriaGrupos.length == 0) {
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Obrigatório Selecionar pelo menos Hum Grupo!", this.selectedCategoria.getDscCategoria());
            } else if (this.selectedCategoria.getDscCategoria().isEmpty()) {
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Obrigatório preencher o Campo Descrição!", this.selectedCategoria.getDscCategoria());
            } else {
                this.selectedCategoria.setIdCategoria(null);
                this.selectedCategoria.setCategoriaGrupoList(Arrays.asList(this.selectedCategoriaGrupos));
                this.categoriaService.create(this.selectedCategoria);

                msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Categoria Inserida com Sucesso", this.selectedCategoria.getDscCategoria());
            }
        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Inserir", this.selectedCategoria.getDscCategoria());
        } finally {
            this.preparaInserir(actionEvent);
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public void alterar(ActionEvent actionEvent) {
        msg = null;

        try {
            if (this.selectedCategoriaGrupos.length == 0) {
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Obrigatório Selecionar pelo menos Hum Grupo!", this.selectedCategoria.getDscCategoria());
            } else if (this.selectedCategoria.getDscCategoria().isEmpty()) {
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Obrigatório preencher o Campo Descrição!", this.selectedCategoria.getDscCategoria());
            } else {
                this.selectedCategoria.setCategoriaGrupoList(Arrays.asList(this.selectedCategoriaGrupos));
                this.categoriaService.edit(this.selectedCategoria);
                msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Categoria Alterada com Sucesso", this.selectedCategoria.getDscCategoria());
            }
        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Alterar", this.selectedCategoria.getDscCategoria());
        } finally {
            this.preparaInserir(actionEvent);
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public void excluir(ActionEvent actionEvent) {
        msg = null;

        try {
            this.categoriaService.destroy(this.selectedCategoria);

            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Categoria Excluida com Sucesso", this.selectedCategoria.getDscCategoria());
        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Erro ao Excluir: " + this.selectedCategoria.getDscCategoria(), "CATEGORIA SENDO UTILIZADA EM ALGUM PROCESSO!");
        } finally {
            this.preparaInserir(actionEvent);
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public GenericDataModel getListCategoriaGrupo() {
        return listCategoriaGrupo;
    }

    public void setListCategoriaGrupo(GenericDataModel listCategoriaGrupo) {
        this.listCategoriaGrupo = listCategoriaGrupo;
    }

    public CategoriaGrupo[] getSelectedCategoriaGrupos() {
        return selectedCategoriaGrupos;
    }

    public void setSelectedCategoriaGrupos(CategoriaGrupo[] selectedCategoriaGrupos) {
        this.selectedCategoriaGrupos = selectedCategoriaGrupos;
    }
}
